package cn.lkp.mall.seckill.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 定时任务
 *      1、@EnableScheduling 开启定时任务
 *      2、@Scheduled开启一个定时任务
 *      3. 自动配置类TaskSchedulingAutoConfiguration 默认只有1个线程
 *
 * 异步任务
 *      1、@EnableAsync:开启异步任务
 *      2、@Async：给希望异步执行的方法标注
 *      3、自动配置类TaskExecutionAutoConfiguration
 *         属性绑定在TaskExecutionProperties，默认有8个线程
 */

@Slf4j
@Component
//@EnableAsync
//@EnableScheduling
public class HelloScheduled {

    /**
     * 1、在Spring中cron表达式是6位组成，秒 分 时 这个月的第几日 月 周几，而一般cron表达式中多支持一位，第七位表示年份
     * 2、在周几的的位置,1-7代表周一到周日，而一般cron表达式中1-7代表周日到周六
     * 3、定时任务不该阻塞。默认是阻塞的 TimeUnit.SECONDS.sleep(3)
     *      1）、可以让业务以异步的方式，自己提交到线程池
     *              CompletableFuture.runAsync(() -> {
     *         },execute);
     *
     *      2）、支持定时任务线程池；默认只有1个线程，
     *          设置 TaskSchedulingProperties  spring.task.scheduling.pool.size: 5
     *          但不是在所有的spring boot版本中都生效，所以不采用
     *
     *      3）、让定时任务异步执行
     *          异步任务
     *          #配置异步任务线程池
     *            spring：
     *              task:
     *                execution:
     *                  pool:
     *                    core-size: 5
     *                    max-size: 50
     *
     *      选择第三种方案解决：使用异步任务 + 定时任务来完成定时任务不阻塞的功能
     *
     *  springboot不是整合QUARTZ,而是使用自己的定时任务
     *
     */
    /**
     * 需配合类上的注解@EnableAsync @EnableScheduling同时使用，每周五，每隔2秒定时上架
     */
//     @Async
//     @Scheduled(cron = "*/2 * * ? * 6")
//     public void hello() {
//         log.info("hello...");
//         try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
//
//     }
}
